home *** CD-ROM | disk | FTP | other *** search
- /*
- *
- * ide_extern.h -- Externally used data structures and constants for IDE
- * Disk driver
- *
- * KERNEL VERSION
- *
- * HISTORY
- * 22-Nov-1992 David Somayajulu at Next Computer Inc.,
- * Created.
- *
- */
-
- #ifndef _BSD_DEV_IDE_EXTERN_
- #define _BSD_DEV_IDE_EXTERN_
-
- #import <sys/types.h>
- #import <sys/ioctl.h>
- #ifdef KERNEL
- #import <machdep/machine/pmap.h>
- #import <vm/vm_map.h>
- #endif KERNEL
- #import <mach/boolean.h>
- #import <mach/vm_param.h>
-
- #define NIDE_PCAT 2 // number of IDE drives on AT bus
-
- typedef struct _ideDriveInfo {
- unsigned short type; // as given in the CMOS R*M space
- unsigned char control_byte;
- unsigned char interleave; // interleave
- unsigned capacity; // formatted capacity in bytes
- unsigned short cylinders; // number of cylinders
- unsigned char heads; // total number of heads
- unsigned char sectors_per_trk;// sectors per track
- unsigned bytes_per_sector;// bytes per sector
- unsigned access_time; // average access time
- unsigned short precomp; // cylinder where precompensation
- unsigned short landing_zone;
- } ideDriveInfo_t;
-
- // Port Addresses for Ide Controller Registers on PC AT
-
- typedef struct _ideRegsAddrs {
- unsigned data; // data register base port (read/write)
- unsigned error; // error register (read only)
- unsigned sectCnt; // sector count (read/write)
- unsigned sectNum; // sector number (read/write)
- unsigned cylLow; // cylinder low (read/write)
- unsigned cylHigh; // cylinder high (read/write)
- unsigned drHead; // drive, head select register (read/write)
- unsigned status; // status register (read only)
- unsigned command; // command register (write only)
- unsigned cntrlAddr; // control register; also known as
- // digital output register
- unsigned altStatus; // same as status expect that it does not
- // clear a pending interrupt
- } ideRegsAddrs_t;
-
- // Register values for IDE Controller for PC AT
-
- typedef struct _ideRegsVal {
- unsigned short data; // data register base port (read/write)
- unsigned char error; // error register (read only)
- unsigned char sectCnt;// sector count (read/write)
- unsigned char sectNum;// sector number (read/write)
- unsigned char cylLow; // cylinder low (read/write)
- unsigned char cylHigh;// cylinder high (read/write)
- unsigned char drHead; // drive, head select register (read/write)
- unsigned char status; // status register (read only)
- unsigned char command;// command register (write only)
- } ideRegsVal_t;
-
- // defines for error register
-
- #define BAD_BLOCK 0x80
- #define ECC_ERROR 0x40
- #define ID_NOT_FOUND 0x10
- #define CMD_ABORTED 0x04
- #define TRK000_NOT_FOUND 0x02
- #define DAM_NOT_FOUND 0x01
-
-
- // defines for drive, head select register
-
- #define DRHD_FIXED 0xa0
- #define DRIVE_SEL 0x10
- #define SEL_DRIVE0 0x00
- #define SEL_DRIVE1 0x10
- #define HEAD_SEL 0x0F
-
- // defines for status register
-
- #define BUSY 0x80
- #define READY 0x40
- #define WRITE_FAULT 0x20
- #define SEEK_COMPLETE 0x10
- #define DREQUEST 0x08
- #define ERROR_CORRECTED 0x04
- #define INDEX 0x02
- #define ERROR 0x01 // previous command ended in error
-
- // defines for control register
-
- #define HEADSEL3_ENABLE 0x08
- #define DISK_RESET_ENABLE 0x04
- #define DISK_INTERRUPT_ENABLE_NOT 0x02
-
- // end of IDE register related defines
-
-
- typedef int ide_return_t; /* see IDER_xxx, below */
-
- //
- // I/O request struct. Used in IDEIOCREQ ioctl to specify one command sequence
- // to be executed.
- //
-
- typedef struct _ideIoReq {
-
- // inputs to driver:
-
- unsigned cmd;
-
- // mandatory commands
-
- #define IDE_READ 0x20
- #define IDE_WRITE 0x30
- #define IDE_SEEK 0x70
- #define IDE_RESTORE 0x10
- #define IDE_FORMAT_TRACK 0x50 // under dispute not implemented
- #define IDE_READ_VERIFY 0x40
- #define IDE_DIAGNOSE 0x90
- #define IDE_SET_PARAMS 0x91
-
- // optional commands
-
- #define IDE_GET_INFO 0xEC
- #define IDE_SET_MULTIPLE 0xC6
- #define IDE_READ_MULTIPLE 0xC4
- #define IDE_WRITE_MULTIPLE 0xC5
- #define IDE_READ_DMA 0xC8
- #define IDE_WRITE_DMA 0xCA
-
- unsigned block; // starting block for IDE_READ,
- // IDE_WRITE, IDE_READ_VERIFY,
- // IDE_SEEK
- unsigned blkcnt; // no. of blocks for IDE_READ,
- // IDE_SEEK
- // IDE_WRITE and IDE_READ_VERIFY
-
- caddr_t addr; // starting address for IDE_READ,
- // IDE_WRITE and IDE_GET_INFO
-
- unsigned timeout;// timeout value in milliseconds
- unsigned char maxSectorsPerIntr;// Only for IDE_SET_MULTIPLE.
- // this gives the number of sectors to
- // transfered per interrupt
-
- // outputs from driver
-
- ide_return_t status; // IDER_SUCCESS, etc.
- unsigned blocks_xfered;// no. of blocks actually
- // transfered
- ideRegsVal_t regValues;// dump of registers when status
- // equals IDER_CMD_ERROR
- unsigned diagResult; // result if cmd == IDE_DIAGNOSE
-
- // used internally by driver
- #ifdef KERNEL
- vm_map_t map; // map of requestor's task
- #else
- void *map;
- #endif KERNEL
-
- }ideIoReq_t;
-
- // defines for ide_return_t
-
- #define IDER_SUCCESS 0 // OK
- #define IDER_TIMEOUT 1 // cmd has not completed in the value
- // specified
- #define IDER_MEMALLOC 2 // couldn't allocate memory
- #define IDER_MEMFAIL 3 // memory transfer error
- #define IDER_REJECT 4 // bad field in ideIoReq_t
- #define IDER_BADDRV 5 // drive not present
- #define IDER_CMD_ERROR 6 // basic command failure
- #define IDER_VOLUNAVAIL 7 // Requested Volume not available
- #define IDER_SPURIOUS 8 // spurious interrupt
- #define IDER_CNTRL_REJECT 9 // controller has rejected
-
- // Defines for ioctls specific to IDE
-
- #define IDEDIOCINFO _IOR('i',1, struct _ideDriveInfo)
-
- #define IDEDIOCREQ _IOWR('i',2, struct _ideIoReq)
-
-
- #define MAX_IDETYPE 0xFF
- #define MIN_IDETYPE 1
-
- #define MAX_BLOCKS_PER_XFER 256
- #define IDE_MAX_PHYS_IO (64 * 1024)
-
- #define IDE_SECTOR_SIZE 512 //sector size in bytes
- // structure returned by IDE_GET_INFO command
-
- typedef struct _ideIdentifyInfo {
- unsigned short genConfig;
- unsigned short cylinders;
- unsigned short reserved0;
- unsigned short heads;
- unsigned short unformattedBytesPerTrack;
- unsigned short unformattedBytesPerSector;
- unsigned short sectorsPerTrack;
- unsigned short vendorSpecific0[3];
- unsigned short serialNumber[10];// 0x0000 => not specified
- unsigned short bufferType;
- unsigned short bufferSize; //in 512 byte increments 0x0000 => not
- //specified
- unsigned short eccBytes; //number of ECC bytes available on
- //Read/Write Long Commands
- //0x0000 => not specified
- unsigned char firmwareRevision[8];
- unsigned char modelNumber[40];
- unsigned short multipleSectors;
- #define IDE_MULTI_SECTOR_MASK 0xFF
- //maximum number of sectors that can
- //be transfered per single interrupt
- //on IDE_READ_MULTIPLE and
- //IDE_WRITE_MULTIPLE commands
- // 0x00 => IDE_WRITE_MULTIPLE and
- //IDE_READ_MULTIPLE are not
- //implemented
- unsigned short doubleWordIO; //0x0000 => can perform doubleword I/O
- //0x0001 => cannot perform doubleword
- // I/O
- unsigned short capabilities;
- #define IDE_CAP_LBA_SUPPORTED 0x0200
- #define IDE_CAP_DMA_SUPPORTED 0x0100
-
- unsigned short reserved1;
- unsigned short pioDataTransferCyleTimingMode;
- #define IDE_PIO_TIMING_MODE_MASK 0xFF
- unsigned short dmaDataTransferCyleTimingMode;
- #define IDE_DMA_TIMING_MODE_MASK 0xFF
- unsigned short translationValid;
- #define IDE_TRANSLATION_VALID 0x0001 //fields reported in
- //translation mode valid
- #define IDE_TRANSLATION_MAYBE_VALID_NOT 0x0000 //fields reported in
- //translation mode may be valid
-
- unsigned short currentCylinders;
- unsigned short currentHeads;
- unsigned short currentSectorsPerTrack;
- unsigned short capacity[2]; //capacity in sectors
- unsigned short multiSectorInfo;
- #define IDE_MULTI_SECTOR_VALID 0x01
- #define IDE_SECTORS_PER_INTERRUPT 0xFF
- unsigned userAddressableSectors; //total number of user
- //addressabel sectors for
- //LBA mode
- unsigned short swDma;
- #define IDE_SW_DMA_ACTIVE 0xFF00//single word dma transfer mode active
- #define IDE_SW_DMA_SUPPORTED 0x00FF//single word dma transfer mode
- //supported
- unsigned short mwDma;
- #define IDE_MW_DMA_ACTIVE 0xFF00//multi word dma transfer mode active
- #define IDE_MW_DMA_SUPPORTED 0x00FF//multi word dma transfer mode
- //supported
- unsigned short reserved2[64];
- unsigned short vendorSpecific[32];
- unsigned short reserved3[96];
- } ideIdentifyInfo_t;
-
- #if i386
- #define IDE_MAX_DMA_SIZE PAGE_SIZE // Maximum Number of bytes of data
- // that can be transfered via DMA
- // using IDEDIOCREQ ioctl command
- #endif
-
- #endif _BSD_DEV_IDE_EXTERN_
-
-